home *** CD-ROM | disk | FTP | other *** search
/ BMUG PD-ROM B4 / PD-ROM B4.iso / Entertainment / Strategy / Robots / bot 1.0.1 / Tutorial / BASIC / Middle < prev    next >
Text File  |  1991-07-15  |  6KB  |  228 lines

  1. !
  2. ! Middle
  3. !
  4. ! This bot uses a number of the more advanced design options,
  5. ! including intelligent damage recognition and a repair
  6. ! mechanism.  It takes advantage of the fact that from the
  7. ! middle of the arena you are always scanning at a fairly close
  8. ! distance, so it's more likely that a given scan will find an
  9. ! enemy bot (Which means you want a very wide scan increment
  10. ! when scanning in a circle).
  11.  
  12.  
  13. #DATA
  14.  
  15. EQU INCR        37
  16. EQU FIND_INCR   11
  17.  
  18. DEF scn
  19. DEF d
  20. DEF damageLoc
  21. DEF temp
  22. DEF cpuThresh
  23. DEF firstTime 0
  24.  
  25. #CODE BASIC
  26.     
  27.     cpuThresh = $CPU/2  ! If CPU < 1/2 MAXCPU, then the repair
  28.                         ! mechanism might jam.  Therefore,
  29.                         ! don't use it to time movements.
  30.     
  31.     d = $DAMAGE
  32.     Goto RunawayStart   ! Move to center
  33.     
  34. :Start
  35.     d = $DAMAGE
  36.     scn = Random(360)
  37.     
  38. :ScanLoop
  39.     If ($DAMAGE <> d) Then Goto GotHit
  40.     scn = scn + INCR
  41.     Scan Angle scn
  42.     If ($FOUND == 0) Then Goto ScanLoop
  43. :ScanLock
  44.     Fire Weapon 1, Angle $ANGLE
  45.     If ($DAMAGE <> d) Then Goto GotHit
  46.     Scan Angle $ANGLE       ! Center the scanner on the enemy
  47.     If ($FOUND <> 0) Then Goto ScanLock
  48.                             ! If we lost the lock, continue on
  49.  
  50. :LockOn                     ! Try to locate the moving enemy
  51.     Scan Angle scn-43
  52.     If ($FOUND <> 0) Then Goto ScanLock
  53.     Scan Angle scn-43 + FIND_INCR
  54.     If ($FOUND <> 0) Then Goto ScanLock
  55.     
  56.     If ($DAMAGE <> d) Then Goto GotHit  !In case we've been hit
  57.     
  58.     Scan Angle scn-43 + FIND_INCR*2
  59.     If ($FOUND <> 0) Then Goto ScanLock
  60.     Scan Angle scn-43 + FIND_INCR*3
  61.     If ($FOUND <> 0) Then Goto ScanLock
  62.     
  63.     Goto ScanLoop           ! Couldn't find him.
  64.  
  65. ! These routines are called if damage is taken while we're
  66. ! sitting in the center of the arena.  Calls to the REPAIR
  67. ! mechanism are used to time the movement (and they repair the
  68. ! CPU if it gets damaged).  The bot will basically make a loop
  69. ! and go back into the middle.
  70.  
  71. :GotHit
  72.     Velocity 220, 70        ! Start running immediately
  73.     damageLoc = $DAMAGEDIR
  74.     If ($CPU >= cpuThresh) Then
  75.       begin
  76.         Repair C_CPU For 2      ! Repair the CPU for 20
  77.         Velocity -70, -220
  78.         Repair C_CPU For 2      ! Repair some more
  79.         d = $DAMAGE
  80.       end
  81.     Else                    ! If CPU has been damaged:
  82.       begin
  83.         Wait 20             ! If the repair mechanism jams due
  84.                             ! to the damaged CPU, we might keep
  85.                             ! repairing as we moved right into
  86.                             ! a wall!  Don't take that chance.
  87.         Velocity -40, -150
  88.         Repair C_CPU For 2                    
  89.         Velocity 0, 0
  90.         d = $DAMAGE
  91.       end
  92.  
  93. ! Move to the center of the arena.  If you get hit, go to the
  94. ! appropriate DAMAGE routine, below.  This is the same basic
  95. ! movement routine used by the previous bots, except that it
  96. ! checks for damage.
  97.  
  98. :RunawayStart
  99.     temp = Random(360)      ! Pick a random firing angle
  100.     Fire Weapon 1, Angle temp
  101. :RunawayX
  102.     If (d <> $DAMAGE) Then Goto XDamage
  103. :ContinueX
  104.     Velocity (128-$XLOC)*4, 0
  105.     Fire Weapon 1           ! Fire while moving.  Why not?
  106.                             ! After all, you might hit someone.
  107.     If ($XLOC > 136) Then Goto RunawayX
  108.     If ($XLOC < 120) Then Goto RunawayX
  109.     Velocity 0, 0
  110.     
  111. :RunawayY
  112.     If (d <> $DAMAGE) Then Goto YDamage
  113. :ContinueY
  114.     Velocity 0, (128-$YLOC)*4
  115.     Fire Weapon 1
  116.     If ($YLOC > 136) Then Goto RunawayY
  117.     If ($YLOC < 120) Then Goto RunawayY
  118.     Velocity 0, 0
  119.     
  120.     firstTime = firstTime + 1
  121.     If (firstTime == 1) Then Goto Start
  122.                             ! Don't do the following routine
  123.                             ! the first time we move.
  124.  
  125. ! Use the Damage Recognition System:  The general direction of
  126. ! the shot that hit us is now stored in DAMAGE_LOC (it was in
  127. ! $DAMAGELOC), but DAMAGE_LOC got a copy of it right after we
  128. ! started to run away).  That value is accurate (roughly)
  129. ! within 45 degrees.  So, start scanning 45ish degrees less
  130. ! than that value and try to find your attacker.
  131.  
  132.     d = $DAMAGE
  133.     For scn =    (Random(4)+damageLoc-47)           &
  134.             To   damageLoc + 43                     &
  135.             Step FIND_INCR
  136. :FindScanLock
  137.         If (d <> $DAMAGE) Then Goto GotHit
  138.                                     ! Jump out of For-Next!
  139.         Scan Angle scn
  140.         If ($FOUND <> 0) Then
  141.           begin
  142.             Fire Weapon 1, Angle $ANGLE
  143.             Goto FindScanLock       ! Still locked on
  144.           end
  145.       Next scn                      ! No lock.
  146.     
  147.     Goto Start
  148.  
  149.  
  150. ! These routines are called if the bot takes damage while
  151. ! moving to the center of the arena.  They check to see if the
  152. ! damage was due to a collision ($DAMAGETYPE == 4).  If not,
  153. ! then don't worry about it, as the enemy probably can't lock
  154. ! on to a moving target too well.  If so, then we bumped into
  155. ! someone.  Scan for them and shoot if we find them.
  156.  
  157.  
  158. :XDamage
  159.     d = $DAMAGE
  160.     If ($DAMAGETYPE <> C_COLLIDE) Then Goto ContinueX
  161.                         ! Damage was from a collision
  162.     If ($XLOC > 130) Then   ! Are we moving left or right?
  163.       begin
  164.         Velocity 10, 0      ! (Back up slowly while firing)
  165.         scn = 180
  166.       end
  167.     Else
  168.       begin
  169.         Velocity -10, 0
  170.         scn = 0
  171.       end
  172.     Scan Angle scn          ! Scan along the x-axis
  173.     If ($FOUND <> 0) Then Goto XQuickShot
  174.     Scan Angle scn-30       ! Scan -30 degrees from the x-axis
  175.     If ($FOUND <> 0) Then Goto XQuickShot
  176.     Scan Angle scn+30       ! Scan +30 degrees from the x-axis
  177.     If ($FOUND <> 0) Then Goto XQuickShot
  178.     d = $DAMAGE
  179.     Goto ContinueX
  180.     
  181. :XFireAt
  182.     Scan Angle $ANGLE       ! Center the scanner on the enemy
  183.     If ($FOUND == 0) Then
  184.       begin
  185.         d = $DAMAGE
  186.         Goto ContinueX
  187.       end
  188. :XQuickShot
  189.     Fire Weapon 1, Angle $ANGLE
  190.     Goto XFireAt
  191.  
  192.  
  193. :YDamage
  194.     d = $DAMAGE
  195.     If ($DAMAGETYPE <> C_COLLIDE) Then Goto ContinueY
  196.                         ! Damage was from a collision
  197.     If ($YLOC > 130) Then   ! Are we moving up or down?
  198.       begin
  199.         Velocity 0, 10      ! (Back up slowly while firing)
  200.         scn = 270
  201.       end
  202.     Else
  203.       begin
  204.         Velocity 0, -10
  205.         scn = 90
  206.       end
  207.     Scan Angle scn      ! Scan along the y-axis
  208.     If ($FOUND <> 0) Then Goto YQuickShot
  209.     Scan Angle scn-30   ! Scan -30 degrees from the y-axis
  210.     If ($FOUND <> 0) Then Goto YQuickShot
  211.     Scan Angle scn+30   ! Scan +30 degrees from the y-axis
  212.     If ($FOUND <> 0) Then Goto YQuickShot
  213.     d = $DAMAGE
  214.     Goto ContinueY
  215.     
  216. :YFireAt
  217.     Scan Angle $ANGLE       ! Center the scanner on the enemy
  218.     If ($FOUND <> 0) Then
  219.       begin
  220.         d = $DAMAGE
  221.         Goto ContinueY
  222.       end
  223. :YQuickShot
  224.     Fire Weapon 1, Angle $ANGLE
  225.     Goto YFireAt
  226.  
  227. #END
  228.